# _*_ encoding:utf-8 _*_

"""
    自定义文件存储后端，实现拼接完整的图片链接

    Storage： 默认Django存储后端，决定了外面文件类型字段的新建/保存和访问
"""

from django.core.files.storage import Storage  # Django默认的存储后端
from django.conf import settings
from rest_framework.exceptions import ValidationError
from fdfs_client.client import Fdfs_client


class FastDFSStorage(Storage):

    def __init__(self, fdfs_base_url=None):
        self.fdfs_base_url = fdfs_base_url or settings.FDFS_BASE_URL

    def _open(self, name, mode='rb'):
        # 功能： 打开django本地文件
        pass

    def _save(self, name, content, max_length=None):
        # 功能：在ImageField类型字段被赋值为一个文件对象的时候触发调用保存文件数据
        # 参数: @name:文件名；@content:文件对象；
        # 返回值：返回值就是将来保存到数据库的值(返回文件id)
        # (1)、提取文件数据
        data = content.read()
        # (2)、上传到fdfs
        conn = Fdfs_client(settings.FDFS_PATH)
        res = conn.upload_by_buffer(data)
        if res['Status'] != 'Upload successed.':
            raise ValidationError('fdfs上传失败！')
        file_id = res['Remote file_id']
        # (3)、返回文件id
        return file_id

    def exists(self, name):
        return False

    def url(self, name):
        # 功能： 拼接返回完整的图片链接
        # 参数: name是文件索引标识（存储在mysql中的文件id）
        return self.fdfs_base_url + name








